# encoding: utf-8
# 项目名称： 常用设计模式
# @File  : 016-模板方法.py
# @Author: SunHao
# @Desc :
# @Date  :   19:54 2024/11/06

from abc import ABCMeta, abstractmethod
from time import sleep


# 定义一个抽象基类 Window，使用 ABCMeta 元类来定义抽象方法
class Window(metaclass=ABCMeta):
    @abstractmethod
    def start(self):
        pass  # 抽象方法，子类必须实现，用于启动窗口

    @abstractmethod
    def repaint(self):
        pass  # 抽象方法，子类必须实现，用于重新绘制窗口内容

    @abstractmethod
    def stop(self):  # 钩子操作
        pass  # 抽象方法，子类必须实现，用于停止窗口

    def run(self):
        # 模板方法，定义了算法骨架
        self.start()  # 启动窗口
        while True:
            try:
                self.repaint()  # 重新绘制窗口内容
                sleep(1)  # 每隔一秒重新绘制一次
            except KeyboardInterrupt:
                # 捕获键盘中断信号（Ctrl+C），退出循环
                break
        self.stop()  # 停止窗口


# 具体窗口类 MyWindow，继承自 Window 抽象基类
class MyWindow(Window):
    def __init__(self, msg):
        self.msg = msg  # 初始化窗口消息

    def start(self):
        print('窗口开始运行')  # 实现启动窗口的具体逻辑

    def stop(self):
        print('窗口结束运行')  # 实现停止窗口的具体逻辑

    def repaint(self):
        print(self.msg)  # 实现重新绘制窗口的具体逻辑


# 客户端代码
MyWindow('Hello World').run()  # 创建 MyWindow 对象并运行